<?php

require_once 'BancoDeDados.php';
require_once 'EspacoCultural.php';

class Arquivo {

    private $cod_arquivo;
    private $conteudo;
    private $descricao;
    private $nome;
    private $tipo;
    private $espaco;

    public function getConteudo() {
        return $this->conteudo;
    }

    public function setConteudo($conteudo) {
        $this->conteudo = $conteudo;
    }

    public function getNome() {
        return $this->nome;
    }

    public function setNome($nome) {
        $this->nome = $nome;
    }

    public function getTipo() {
        return $this->tipo;
    }

    public function setTipo($tipo) {
        $this->tipo = $tipo;
    }

    public function &getCod_arquivo() {
        return $this->cod_arquivo;
    }

    public function setCod_arquivo(&$cod_arquivo) {
        $this->cod_arquivo = &$cod_arquivo;
    }

    public function &getDescricao() {
        return $this->descricao;
    }

    public function setDescricao(&$descricao) {
        $this->descricao = &$descricao;
    }

    /**
     *
     * @return EspacoCultural
     */
    public function &getEspaco() {
        return $this->espaco;
    }

    public function setEspaco(EspacoCultural &$espaco) {
        $this->espaco = &$espaco;
    }

    public function cadastrar() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $result = null;
        
        if(BancoDeDados::getInstance()->getSgbd() == "MYSQL") {
            $stmt = $link->prepare("insert into arquivo(descricao, cod_espaco,nome,tipo, conteudo) values(?,?,?,?,?)");
        } else {
            $stmt = $link->prepare("insert into arquivo(descricao, cod_espaco,nome,tipo, conteudo) values(?,?,?,?,decode(? , 'hex'))");    
        }
        
        $result = $link->execute($stmt, array($this->descricao, $this->espaco->getCod_espaco(), $this->nome, $this->tipo, $this->conteudo));
        
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $link->commit();
    }

    public function alterarCampo(&$campo_id, &$campo_valor) {
        if ($campo_id == 'descricao' && $this->descricao != $campo_valor) {
            $temp = &$this->descricao;
            $this->descricao = &$campo_valor;
        } else {
            throw new Exception('no_action');
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update arquivo set ' . $campo_id . ' = ? where cod_arquivo = ?');
        $result = $link->execute($stmt, array($campo_valor, $this->cod_arquivo));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}" . " |" . $temp);
        }
        $link->commit();
    }

    public function excluir() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('delete from arquivo where cod_arquivo = ?');
        $result = $link->execute($stmt, array($this->cod_arquivo));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $link->commit();
    }

    public static function &listar($cod_espaco, $filtro) {
        $filtro = "%$filtro%";
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query("select cod_arquivo, descricao, nome, tipo from arquivo where cod_espaco = ? and tipo like ? order by nome", array($cod_espaco, $filtro));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $resultado = array();
        while ($result->fetchInto($row)) {
            $arquivo = new Arquivo();
            $arquivo->setCod_arquivo($row['cod_arquivo']);
            $arquivo->setDescricao($row['descricao']);
            $arquivo->setTipo($row['tipo']);
            $arquivo->setNome($row['nome']);
            $resultado[] = &$arquivo;
            unset($arquivo);
        }
        return $resultado;
    }

    public static function &consultar($cod_arquivo) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query("select cod_arquivo, descricao, nome, tipo, encode(conteudo, 'base64') AS data from arquivo where cod_arquivo = ?", array($cod_arquivo));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        if ($result->numRows() == 0) {
            throw new Exception("Arquivo inexistente");
        } elseif ($result->numRows() > 1) {
            throw new Exception("Mais de uma Arquivo com o mesmo identificador, informe ao administrador");
        }
        $result->fetchInto($row);
        $arquivo = new Arquivo();
        $arquivo->setCod_arquivo($row['cod_arquivo']);
        $arquivo->setDescricao($row['descricao']);
        $arquivo->setConteudo($row['data']);
        $arquivo->setTipo($row['tipo']);
        $arquivo->setNome($row['nome']);
        return $arquivo;
    }

}

?>